home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
dev
/
c
/
AmiVoGL_MDEV.lha
/
hershey
/
src
/
h2v.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-18
|
4KB
|
214 lines
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include "hershey.h"
#include "h2v.h"
#ifdef AZTEC_C
# ifndef AMIGA
# define AMIGA
# endif
#endif
/* --------------------------------------------------------------------- */
/*
* Read the raw hersh font data and write the binary font files
* as specified in h2v.h or as specified in an index file.
*/
HTAB hersh[MAX_CHARS];
/* --------------------------------------------------------------------- */
/*
* main driver - if argc > 2 we are creating a file from an
* index, otherwise use the table in h2v.h
*/
int main(
int argc,
char **argv)
{
FILE *fp;
FTAB table;
int i;
if (argc != 2 && argc != 4) {
fprintf(stderr, "Usage: h2v datafile [indexfile fontfile]\n");
exit(1);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "h2v: can't open hersh data file %s\n", argv[1]);
exit(1);
}
readdata(fp);
if (argc == 4) {
readindex(argv[2], argv[3], &table);
writefont(&table);
} else
for (i = 0; i < sizeof(fonts) / sizeof(FTAB); i++)
writefont(&fonts[i]);
exit(0);
}
/* --------------------------------------------------------------------- */
/*
* readdata
*
* Reads the raw hersh data
*/
void readdata(FILE *fp)
{
int i = 0, j, x, y;
int charno, pairs;
char buf[MAX_BUF];
while (getcharacter(fp, &charno, &pairs, buf)) {
hersh[charno - 1].ch = malloc(2 * pairs + 1);
strcpy(hersh[charno - 1].ch, buf);
hersh[charno - 1].len = strlen(hersh[charno - 1].ch);
}
fclose(fp);
}
/*
* readindex
*
* Read an index file into index tab.
*/
void readindex(
char *name,
char *fname,
FTAB *tab)
{
FILE *fp;
int i;
if ((fp = fopen(name, "r")) == NULL) {
fprintf(stderr, "h2v: can't open index file\n");
exit(1);
}
tab->name = fname;
i = 0;
while (fscanf(fp, "%d %d", &tab->ent[i], &tab->ent[i + 1]) == 2)
if ((i += 2) >= MAX_ENTS - 2) {
fprintf(stderr, "h2v: indexfile too big - increase MAX_ENTS\n");
exit(1);
}
tab->ent[i] = 0;
fclose(fp);
}
/*
* writefont
*
* output a font to file name based on font table tab
*/
void writefont(FTAB *tab)
{
int l ,f, j, j1, x, y, k1, k2, k;
short i, nchars, asdecw[3];
short start, end, nvects, fd;
char *p;
HTAB *curch;
fprintf(stderr, "Font name: %s\n", tab->name);
#ifdef PC
if ((fd = open(tab->name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644)) < 0)
#else
# ifdef AMIGA
if ((fd = open(tab->name, O_WRONLY | O_CREAT | O_TRUNC)) < 0)
# else
if ((fd = open(tab->name, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0)
# endif
#endif
{
fprintf(stderr, "Can't open output file: %s\n", tab->name);
exit(1);
}
asdecw[0] = asdecw[2] = -100;
asdecw[1] = 100;
nvects = nchars = 0;
/* Leave room for stuff at top */
#ifdef AMIGA
/* finding this problem was not fun */
start= 0;
for(i= 0; i < 5; ++i) write(fd,&start,sizeof(short));
#else
if(lseek(fd, (long)(5 * sizeof(short)), 0) < 0) {
perror("h2v's writefont: first lseek");
exit(1);
}
#endif
for (i = 0; (start = tab->ent[i]) != 0; i += 2) {
end = tab->ent[i + 1];
do {
curch = &hersh[start - 1];
nchars++;
if (curch->ch == (char *)NULL) {
fprintf(stderr, "h2v: character %d not available\n", start);
exit(1);
}
asdecw[2] = MAX(asdecw[2], curch->ch[1] - curch->ch[0]);
for (p = &curch->ch[2]; *p; p++) {
x = *p++;
if (x != ' ') {
asdecw[0] = MAX(asdecw[0], COORD(*p));
asdecw[1] = MIN(asdecw[1], COORD(*p));
}
}
nvects += curch->len / 2;
if (write(fd, &curch->len, sizeof(short)) != sizeof(short)) {
fprintf(stderr,"h2v: ERROR writing character length to file\n");
exit(1);
}
if (write(fd, curch->ch, (unsigned)curch->len) != curch->len) {
fprintf(stderr,"h2v: ERROR writing character data to file\n");
exit(1);
}
start++;
} while (start <= end);
}
if(lseek(fd, 0L, 0) < 0) {
perror("h2v's writefont: lseek to 0");
exit(1);
}
if (write(fd, &nchars, sizeof(nchars)) != sizeof(nchars)) {
fprintf(stderr,"Error writing to file\n");
exit(1);
}
if (write(fd, &nvects, sizeof(nvects)) != sizeof(nvects)) {
fprintf(stderr,"Error writing to file\n");
exit(1);
}
if (write(fd, asdecw, sizeof(asdecw)) != sizeof(asdecw)) {
fprintf(stderr, "Error writing to file\n");
exit(1);
}
close(fd);
}